/**
 * 角色管理器
 * 负责管理小偷角色的状态和动画
 */
class CharacterManager {
    constructor(game) {
        // 游戏实例引用
        this.game = game;
        
        // 角色状态
        this.state = 'walking'; // walking, running, motorcycle, car
        
        // 角色元素
        this.thiefElement = document.getElementById('thief-character');
        
        // 速度阈值
        this.speedThresholds = {
            walking: 0,     // 0-30 WPM
            running: 30,    // 30-60 WPM
            motorcycle: 60, // 60-90 WPM
            car: 90         // 90+ WPM
        };
        
        // 角色图片
        this.characterImages = {
            walking: 'assets/images/sprites/thief/walking.png',
            running: 'assets/images/sprites/thief/running.png',
            motorcycle: 'assets/images/sprites/thief/motorcycle.png',
            car: 'assets/images/sprites/thief/car.png'
        };
        
        // 动画帧计数
        this.frameCount = 0;
        
        // 动画速度（每秒帧数）
        this.animationSpeed = 10;
        
        // 上次更新时间
        this.lastUpdateTime = 0;
    }
    
    /**
     * 初始化角色
     */
    init() {
        // 设置初始状态
        this.setState('walking');
        
        // 重置动画
        this.frameCount = 0;
        this.lastUpdateTime = Date.now();
        
        // 设置初始位置（先移除过渡效果，设置位置后再添加）
        if (this.thiefElement) {
            // 暂时移除过渡效果
            this.thiefElement.style.transition = 'none';
            
            // 设置初始位置
            this.thiefElement.style.left = '50px';
            
            // 强制重绘
            this.thiefElement.offsetHeight;
            
            // 恢复过渡效果
            setTimeout(() => {
                this.thiefElement.style.transition = 'left 0.3s ease-out, transform 0.3s ease';
            }, 50);
        }
    }
    
    /**
     * 更新角色状态
     */
    update() {
        // 获取当前打字频率
        const frequency = this.game.typingManager.getTypingFrequency();
        
        // 记录之前的状态
        const previousState = this.state;
        
        // 根据打字频率更新状态
        // 频率阈值（每分钟字符数）
        if (frequency >= 180) { // 每分钟180个字符 = 每分钟36个单词
            this.setState('car');
        } else if (frequency >= 120) { // 每分钟120个字符 = 每分钟24个单词
            this.setState('motorcycle');
        } else if (frequency >= 60) { // 每分钟60个字符 = 每分钟12个单词
            this.setState('running');
        } else {
            this.setState('walking');
        }
        
        // 如果状态发生变化，记录日志
        if (previousState !== this.state) {
            console.log(`角色状态从 ${previousState} 变为 ${this.state}，当前频率: ${frequency.toFixed(1)} CPM`);
        }
        
        // 更新动画
        this.updateAnimation();
    }
    
    /**
     * 设置角色状态
     * @param {string} state 状态 (walking, running, motorcycle, car)
     */
    setState(state) {
        if (this.state === state) return;
        
        this.state = state;
        
        // 更新角色图片
        if (this.thiefElement) {
            // 移除之前的状态类
            this.thiefElement.className = '';
            this.thiefElement.classList.add('thief-character');
            
            // 添加新状态类
            this.thiefElement.classList.add(`thief-${state}`);
            
            // 更新动画速度
            switch (state) {
                case 'walking':
                    this.animationSpeed = 5;
                    break;
                case 'running':
                    this.animationSpeed = 10;
                    break;
                case 'motorcycle':
                    this.animationSpeed = 15;
                    break;
                case 'car':
                    this.animationSpeed = 20;
                    break;
            }
            
            console.log(`小偷状态更新为: ${state}, 动画速度: ${this.animationSpeed}`);
        }
    }
    
    /**
     * 更新角色动画
     */
    updateAnimation() {
        const now = Date.now();
        const deltaTime = (now - this.lastUpdateTime) / 1000;
        
        // 更新帧计数
        this.frameCount += deltaTime * this.animationSpeed;
        
        if (this.thiefElement) {
            const bounceHeight = Math.sin(this.frameCount) * 5;
            
            // 根据状态调整动画效果
            switch (this.state) {
                case 'walking':
                    this.thiefElement.style.transform = `translateY(${bounceHeight}px)`;
                    break;
                case 'running':
                    this.thiefElement.style.transform = `translateY(${bounceHeight}px) rotate(${Math.sin(this.frameCount * 2) * 5}deg)`;
                    break;
                case 'motorcycle':
                    this.thiefElement.style.transform = `translateY(${bounceHeight * 0.5}px) rotate(${Math.sin(this.frameCount) * 3}deg)`;
                    break;
                case 'car':
                    // 汽车状态的动画：轻微上下颠簸 + 前后微晃
                    const carBounce = Math.sin(this.frameCount * 1.5) * 2;
                    const carRock = Math.sin(this.frameCount * 0.8) * 1;
                    this.thiefElement.style.transform = `translateY(${carBounce}px) rotate(${carRock}deg)`;
                    break;
            }
        }
        
        this.lastUpdateTime = now;
    }
    
    /**
     * 显示踉跄效果
     */
    showStumble() {
        if (this.thiefElement) {
            // 添加踉跄动画类
            this.thiefElement.classList.add('stumble');
            
            // 一段时间后移除动画类
            setTimeout(() => {
                this.thiefElement.classList.remove('stumble');
            }, 500);
        }
    }
    
    /**
     * 获取当前状态
     * @returns {string} 当前状态
     */
    getState() {
        return this.state;
    }
    
    /**
     * 获取当前速度倍率
     * @returns {number} 速度倍率
     */
    getSpeedMultiplier() {
        // 根据状态返回速度倍率
        switch (this.state) {
            case 'walking': return 1;
            case 'running': return 1.5;
            case 'motorcycle': return 2.5;
            case 'car': return 4;
            default: return 1;
        }
    }
    
    /**
     * 重置角色状态
     */
    reset() {
        // 设置初始状态
        this.setState('walking');
        
        // 重置动画
        this.frameCount = 0;
        this.lastUpdateTime = Date.now();
        
        // 重置位置（先移除过渡效果，设置位置后再添加）
        if (this.thiefElement) {
            // 暂时移除过渡效果
            this.thiefElement.style.transition = 'none';
            
            // 设置初始位置
            this.thiefElement.style.left = '50px';
            this.thiefElement.style.transform = 'none';
            
            // 强制重绘
            this.thiefElement.offsetHeight;
            
            // 恢复过渡效果
            setTimeout(() => {
                this.thiefElement.style.transition = 'left 0.3s ease-out, transform 0.3s ease';
            }, 50);
        }
    }
    
    /**
     * 让角色踉跄
     */
    stumble() {
        if (!this.thiefElement) return;
        
        // 添加踉跄效果类
        this.thiefElement.classList.add('stumble');
        
        // 动画结束后移除类
        setTimeout(() => {
            if (this.thiefElement) {
                this.thiefElement.classList.remove('stumble');
            }
        }, 500);
    }
    
    /**
     * 更新角色位置
     */
    updatePosition() {
        if (!this.thiefElement) {
            console.error('小偷元素不存在，无法更新位置');
            return;
        }
        
        // 获取文本完成进度
        const progress = this.game.typingManager.getProgress();
        
        // 获取游戏场景宽度
        const gameScene = document.getElementById('game-scene');
        if (!gameScene) {
            console.error('游戏场景元素不存在');
            return;
        }
        
        // 计算小偷位置
        const sceneWidth = gameScene.offsetWidth;
        const minLeft = 50; // 最左侧位置
        const maxLeft = sceneWidth - 80; // 最右侧位置（留出一些边距）
        
        // 根据进度计算目标位置
        const targetLeft = minLeft + (maxLeft - minLeft) * progress;
        
        // 获取当前位置
        const currentLeft = parseFloat(getComputedStyle(this.thiefElement).left) || minLeft;
        
        // 平滑移动到目标位置
        const moveStep = (targetLeft - currentLeft) * 0.1; // 每次移动目标距离的10%
        const newLeft = currentLeft + moveStep;
        
        // 设置小偷位置
        this.thiefElement.style.left = `${newLeft}px`;
        
        // 如果进度接近100%，触发游戏结束
        if (progress >= 0.99 && !this.game.gameData.gameOver) {
            console.log('小偷到达终点，触发游戏成功结束');
            this.game.end(true);
        }
    }
} 